package flagx

import (
	"flag"
	"fmt"
)

//flag.Value

type Celsius float32

func (c Celsius) String() string {
	return fmt.Sprintf("%f C", c)
}

// 实现 flag.Value 接口

type CelsiusFlag struct{ Celsius }

func (f *CelsiusFlag) Set(s string) error {
	// 命令行输入 按位置与类型 取值
	var unit string
	var value float64
	fmt.Sscanf(s, "%f%s", &value, &unit)
	switch unit {
	case "C", "°C":
		f.Celsius = Celsius(value)
		return nil
	case "F", "°F":
		f.Celsius = Celsius((value - 32.0) * 5.0 / 9.0)
		return nil
	case "K", "°K":
		f.Celsius = Celsius(value - 273.15)
	}
	//未知单位
	return fmt.Errorf("invalid temperature %q", s)
}

// 定义对外方法
func CelsiusFlagFun(name string, value Celsius, usage string) *Celsius {
	f := CelsiusFlag{value}
	flag.CommandLine.Var(&f, name, usage)
	return &f.Celsius
}
